<?php
////////////////////////////////////////////////////////////////////////////
//                                                                        //
// NOTICE OF COPYRIGHT                                                    //
//                                                                        //
// Dean`s Office for Moodle                                               //
// Электронный деканат                                                    //
// <http://deansoffice.ru/>                                               //
//                                                                        //
// Copyright (C) 2008-2999  Alex Djachenko (Алексей Дьяченко)             //
// alex-pub@my-site.ru                                                    //
// Copyright (C) 2008-2999  Evgenij Cigancov (Евгений Цыганцов)           //
// Copyright (C) 2008-2999  Ilia Smirnov (Илья Смирнов)                   //
// Copyright (C) 2008-2999  Mariya Rojayskaya (Мария Рожайская)           //
//                                                                        //
// This program is free software: you can redistribute it and/or modify   //
// it under the terms of the GNU General Public License as published by   //
// the Free Software Foundation, either version 3 of the Licensen.        //
//                                                                        //
// This program is distributed in the hope that it will be useful,        //
// but WITHOUT ANY WARRANTY; without even the implied warranty of         //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          //
// GNU General Public License for more details.                           //
//                                                                        //
// You should have received a copy of the GNU General Public License      //
// along with this program.  If not, see <http://www.gnu.org/licenses/>.  //
//                                                                        //
////////////////////////////////////////////////////////////////////////////
// подключаем библиотеки верхнего уровня
require_once(dirname(realpath(__FILE__))."/../../lib.php");

/** Класс, конструирующий и отправляющий soap-запросы к серверу NaumenSD 
 * @todo сделать более развернутую обработку исключений
 * 
 */
class dof_sync_dnevnikru_soap_service
{
    /**
     * @var SoapClient - объект клиента SOAP, созданный из 
     *                   wsdl-файла Naumen со всеми необходимыми настройками
     */
    protected $soapclient;
    /**
     * @var string - ключ сессии для выполнения запросов к NaumenSD
     */
    protected $sessionid;
    /**
     * @var dof_control
     */
    protected $dof;
    
    /** Конструктор - создает объект клиента для запроса и получает ключ сессии для работы с NaumenSD
     * @param dof_control $dof
     */
    public function __construct($dof)
    {
        $this->dof = $dof;
        
        // получаем параметры соединения из настроек
        // адрес wsdl
        $wsdl     = $this->dof->storage('config')->get_config_value('dnevnikru_service_wsdl', 'sync', 'dnevnikru');
        // логин и пароль для получения ключа сессии
        $login    = $this->dof->storage('config')->get_config_value('dnevnikru_service_login', 'sync', 'dnevnikru');
        $password = $this->dof->storage('config')->get_config_value('dnevnikru_service_password', 'sync', 'dnevnikru');
        
        // из-за неправильного указания адреса сервиса указываем адрес обращения к SOAP-интерфейсам вручную
        $location = $this->dof->storage('config')->get_config_value('dnevnikru_service_location', 'sync', 'dnevnikru');
        
        // создаем объект для работы с soap-запросами к Naumen
        try
        {// авторизуемся
            $this->soapclient = new SoapClient($wsdl, array('location' => $location));
        }catch (SoapFault $e) 
        {  
            var_dump($e); 
        } 
    }
}

/** Класс, реилизующий функции для выгрузки данных, импортируемых в dnevnikru
 *
 */
class dof_sync_dnevnikru_data_exporter
{
    private $valid_formats = array("classes", "students", "teachers", "membership");
    
    protected  $dof;
    /**
     * Конструктор класса
     */
    public function __construct($DOF)
    {
        $this->dof = $DOF;
    }
    
    /**
     * получение данных для экспорта в csv
     * @param string $format - формат данных
     * @return array | false
     * @access public
     */
    public function get_export_data($format)
    {
        $rez = array();
    
        switch ($format)
        {
            case "classes":
                // собираем данные классов
                // получаем список активных подписок
                if ( !$data = $this->dof->storage('programmsbcs')->get_records(array('status' => 'active')) )
                {
                    return array();
                }
    
                // преобразуем данные в нужный формат
                foreach ($data as $key => $value)
                {
                    $tmp_arr = array();
                    // id класса - agenum + programmid
                    $tmp_arr[]  = intval($value->agenum . $value->programmid);
                    // id школы
                    //$tmp_arr[]  = $this->dof->storage('config')->get_config('dnevnikru_school_guid', 'text', 'sync', 'dnevnikru');
                    $tmp_arr[]  = 1;
                    // преобразуем параллель группы в литеру
                    $agenum = $this->dof->storage('agroups')->get_field(array(
                            'id' => $value->agroupid), 'agenum');
    
                    $tmp_arr[]  = chr($agenum + 64);
                    // параллель
                    $tmp_arr[]  = $value->agenum;
                    // учебный период
                    $agestart  = getdate($this->dof->storage('ages')->get_field(array(
                            'id' => $value->agestartid), 'begindate'));
    
                    $tmp_arr[]  = $agestart['year'];
                    // тип отчетного периода - брать из config???
                    $tmp_arr[]  = 'quarter';
                    // описание
                    $tmp_arr[]  = '';
    
                    $rez[] = $tmp_arr;
                }
                return $rez;
    
            case "teachers":
                // собираем данные преподавателей
                // получаем список активных подписок
                $depid = 0;
                $programmid = 1;
                $select = " status = 'active' ";
    
                if (isset($depid))
                {
                    $select .= " AND departmentid = {$depid} ";
                }
                 
                if (isset($programmid))
                {// добавим в список только предметы с указанной программой
                    if ( $tmpids = $this->dof->storage('programmitems')->get_records(array(
                            'programmid' => $programmid), false, 'id') )
                    {
                        $itemids = array();
                        foreach ($tmpids as $key => $value)
                        {
                            $itemids[] = " programmitemid = {$value->id} ";
                        }
                        
                        $select .= " AND ( ". implode('OR', $itemids)." ) ";
                    }
                }
    
                $cstreams = $this->dof->storage('cstreams')->get_records_select($select);
    
                $ids = array();
                foreach ($cstreams as $key => $value)
                {// получаем список id персон по eagreementid по id назначения
                    $eagid = $this->dof->storage('appointments')->get_field(array(
                            'id' => $value->appointmentid, 'status' => 'active'), 'eagreementid');
    
                    $eagids[] = " id = $eagid ";
                }
    
                // список персон по id договоров
                $pids = array();
                $eag_select = " status = 'active'  AND ( ".implode('OR', $eagids)." );";
                $pids = $this->dof->storage('eagreements')->get_records_select($eag_select, array('personid'));
    
                foreach ($pids as $key => $value)
                {// преобразуем список для select
                    $ids[] = " id = {$value->personid} ";
                }
    
                // формируем запрос для выборки персон
                $select = implode(' OR ', $ids)." AND status = 'active' ";
                if ( !$data = $this->dof->storage('persons')->get_records_select($select) )
                {// данных нет - вернем пустой массив
                    return array();
                }
    
                // преобразуем данные в нужный формат
                foreach ($data as $key => $value)
                {
                    $tmp_arr = array();
                    // id персоны
                    $tmp_arr[]  = $value->id;
                    // имя
                    $tmp_arr[]  = $value->firstname;
                    // фамилия
                    $tmp_arr[]  = $value->lastname;
                    // отчество
                    $tmp_arr[]  = $value->middlename;
                    // дата рождения
                    $tmp_arr[]  = date("d/m/y", $value->dateofbirth);
                    // пол
                    $tmp_arr[]  = $value->gender;
                    // email
                    $tmp_arr[]  = $value->email;
        
                    $rez[] = $tmp_arr;
                }
                return $rez;
    
            case "students":
                // собираем данные учащихся
                // получаем список активных подписок
                $programmsbcs = $this->dof->storage('programmsbcs')->get_records(array(
                'status' => 'active'));
                 
                $ids = array();
                foreach ($programmsbcs as $key => $value)
                {// получаем список id персон по contractid подписок
                    $studentid = $this->dof->storage('contracts')->get_field(array(
                            'id' => $value->contractid, 'status' => 'work'), 'studentid');
                
                    $ids[] = " id = '$studentid' ";
                }
                // формируем запрос для выборки персон
                $select = implode(' OR ', $ids)." AND status = 'active' ";
                if ( !$data = $this->dof->storage('persons')->get_records_select($select) )
                {// данных нет - вернем пустой массив
                    return array();
                }
            
                // преобразуем данные в нужный формат
                foreach ($data as $key => $value)
                {
                    $tmp_arr = array();
                    // id персоны
                    $tmp_arr[]  = $value->id;
                    // имя
                    $tmp_arr[]  = $value->firstname;
                    // фамилия
                    $tmp_arr[]  = $value->lastname;
                    // отчество
                    $tmp_arr[]  = $value->middlename;
                    // дата рождения
                    $tmp_arr[]  = date("d/m/y", $value->dateofbirth);
                    // пол
                    $tmp_arr[]  = $value->gender;
                    // email
                    $tmp_arr[]  = $value->email;
                
                    $rez[] = $tmp_arr;
                }
                return $rez;
    
            case "membership":
                // собираем данные членства
                return false;
    
            default: return false;
        }
    
        return false;
    }
    
    /**
     * получение заголовков для экспортного csv файла
     * @param string $format - формат данных
     * @return array | false
     * @access public
     */
    public function get_export_title($format)
    {
        switch ($format)
        {
            case "classes":
                $title_arr = array($this->dof->get_string('title', 'dnevnikru', null, 'sync'),
                        $this->dof->get_string('csv_export_classes_schoolguid', 'dnevnikru', null, 'sync'),
                        $this->dof->get_string('csv_export_classes_liter', 'dnevnikru', null, 'sync'),
                        $this->dof->get_string('csv_export_classes_parall', 'dnevnikru', null, 'sync'),
                        $this->dof->get_string('csv_export_classes_age', 'dnevnikru', null, 'sync'),
                        $this->dof->get_string('csv_export_classes_agetype', 'dnevnikru', null, 'sync'),
                        $this->dof->get_string('csv_export_classes_note', 'dnevnikru', null, 'sync') );
                return $title_arr;
    
            case "students":
                $title_arr = array($this->dof->get_string('csv_export_persons_guid', 'dnevnikru', null, 'sync'),
                        $this->dof->get_string('csv_export_persons_firstname', 'dnevnikru', null, 'sync'),
                        $this->dof->get_string('csv_export_persons_lastname', 'dnevnikru', null, 'sync'),
                        $this->dof->get_string('csv_export_persons_middlename', 'dnevnikru', null, 'sync'),
                        $this->dof->get_string('csv_export_persons_dateofbirth', 'dnevnikru', null, 'sync'),
                        $this->dof->get_string('csv_export_persons_gender', 'dnevnikru', null, 'sync'),
                        $this->dof->get_string('csv_export_persons_email', 'dnevnikru', null, 'sync') );
                return $title_arr;
    
            case "teachers":
                $title_arr = array($this->dof->get_string('csv_export_persons_guid', 'dnevnikru', null, 'sync'),
                        $this->dof->get_string('csv_export_persons_firstname', 'dnevnikru', null, 'sync'),
                        $this->dof->get_string('csv_export_persons_lastname', 'dnevnikru', null, 'sync'),
                        $this->dof->get_string('csv_export_persons_middlename', 'dnevnikru', null, 'sync'),
                        $this->dof->get_string('csv_export_persons_dateofbirth', 'dnevnikru', null, 'sync'),
                        $this->dof->get_string('csv_export_persons_gender', 'dnevnikru', null, 'sync'),
                        $this->dof->get_string('csv_export_persons_email', 'dnevnikru', null, 'sync') );
                return $title_arr;
    
            case "membership":
                $title_arr = array($this->dof->get_string('csv_export_membership_personid', 'dnevnikru', null, 'sync'),
                        $this->dof->get_string('csv_export_membership_schoolguid', 'dnevnikru', null, 'sync'),
                        $this->dof->get_string('csv_export_membership_classid', 'dnevnikru', null, 'sync'),
                        $this->dof->get_string('csv_export_membership_role', 'dnevnikru', null, 'sync'));
                return $title_arr;
    
            default: return false;
        }
        return false;
    }
                
    /**
     * подключение скрипта с экcпортом csv файлов
     * @param string $format - формат данных
     * @param object $exporter - объект, экспортирующий данные
     * @access public
     */
    public function include_export_script($format, $exporter)
    {
        require_once("export_csv.php");
    }    
}
?>